home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Tools / ObjectTcl-1.1 / OtclOserver.H < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-30  |  5.4 KB  |  252 lines

  1. #ifndef OTCL_OSERVER_H
  2. #define OTCL_OSERVER_H
  3.  
  4. // System Includes
  5. #include <sys/types.h>
  6. #include <tcl.h>
  7.  
  8. #include "OtclObject.H"
  9.  
  10. // Message Type Identifiers
  11. #define INSTANCE_METHOD_RQST 'i'
  12. #define CLASS_METHOD_RQST 'c'
  13. #define DELETE_OBJECT_RQST 'd'
  14. #define NEW_OBJECT_RQST 'n'
  15. #define RESPONSE_MSG 'r'
  16. #define MIN_TCP_IP_PORT 1024
  17. #define MAX_TCP_IP_PORT 32767
  18.  
  19. // Forward delcaration
  20. struct fd_set;
  21.  
  22. class OtclChannel
  23. {
  24. public:
  25.    OtclChannel (char *address, Tcl_Interp *, int &result);
  26.    OtclChannel (int fd);
  27.    ~OtclChannel ();
  28.  
  29.    int streamOut (char);
  30.    int streamOut (long);
  31.    int streamOutNullTerminated (char *);
  32.  
  33.    int streamIn (char &);
  34.    int streamIn (long &);
  35.    int streamInNullTerminated (char *&);
  36.  
  37.    int operator == (int fd);
  38.    int getFd (void);
  39.  
  40. private:
  41.    int sendFull (char *, int);
  42.    int recvFull (char *, int);
  43.    int skt;
  44. };
  45.  
  46. class OtclResponse;
  47. class OtclRequest;
  48.  
  49. class OtclOserver
  50. {
  51. public:   // Public Static Attributes
  52.  
  53.    static void (*addReadFd) (int);
  54.    static void (*rmvReadFd) (int);
  55.  
  56. public:   // Public Static Methods
  57.  
  58.    static int initialiseCmd (Tcl_Interp *, int argc, char *argv[]);
  59.    static int processCmd (Tcl_Interp *, int argc, char *argv[]);
  60.    static int oserverCmd (Tcl_Interp *, int argc, char *argv[]);
  61.    static int getAddressCmd (Tcl_Interp *, int argc, char *argv[]);
  62.  
  63.    static void readableFd (int);
  64.  
  65.    // Used to initialise the "currentThread" static attribute at
  66.    // start up.
  67.    static char *createOurThreadId (void);
  68.  
  69.    static OtclResponse *sendRequest (Tcl_Interp *, char *address, OtclRequest*);
  70.  
  71. private:  // Private static methods
  72.  
  73.    static void processRequest (int fd, Tcl_Interp *);
  74.    static void cleanupIncommingChannel (int fd);
  75.    static void processConnectionRequest (void);
  76.  
  77. private:  // Private Attribute
  78.  
  79.    // The file descriptor set for all of the incomming connections
  80.    // including the listening channel (if this is a server)
  81.    static fd_set *incommingFdSet;
  82.  
  83.    // A subset of the above set that contains all of the fd's that do not
  84.    // have a request pending for a different thread of execution
  85.    static fd_set *incommingFdSubset;
  86.  
  87.    // An array of OtclChannel's. OtclChannel object stored against their
  88.    // array fd index.
  89.    static OtclChannel **incommingChannel;
  90.  
  91.    // Array of strings of thread identifiers.
  92.    static char **incommingThread;
  93.  
  94.    static OtclChannel *listener;
  95.    static char *address;
  96.  
  97.    static char *currentThread;
  98.  
  99.    static Tcl_HashTable *outgoingChannel;
  100. };
  101.  
  102. class OtclRequest
  103. {
  104. public:
  105.    OtclRequest ();
  106.    virtual ~OtclRequest ();
  107.  
  108.    virtual int streamIn (OtclChannel *) = 0;
  109.    virtual int streamOut (OtclChannel *) = 0;
  110.    virtual int perform (Tcl_Interp *interp) = 0;
  111. };
  112.  
  113. class OtclInstanceMethodRqst : public OtclRequest
  114. {
  115. public:
  116.  
  117.    OtclInstanceMethodRqst ();
  118.    OtclInstanceMethodRqst (char *symRef, char *method, long argc, char *argv[]);
  119.    ~OtclInstanceMethodRqst ();
  120.  
  121.    int streamIn (OtclChannel *);
  122.    int streamOut (OtclChannel *);
  123.  
  124.    int perform (Tcl_Interp *interp);
  125.  
  126. private:
  127.  
  128.    void clear (void);
  129.  
  130.    char *symRef;
  131.    char *method;
  132.    long argc;
  133.    char **argv;
  134. };
  135.  
  136. class OtclDeleteObjectRqst : public OtclRequest
  137. {
  138. public:
  139.    OtclDeleteObjectRqst ();
  140.    OtclDeleteObjectRqst (char *symRef);
  141.    ~OtclDeleteObjectRqst ();
  142.  
  143.    int streamIn (OtclChannel *);
  144.    int streamOut (OtclChannel *);
  145.  
  146.    int perform (Tcl_Interp *interp);
  147.  
  148. private:
  149.  
  150.    char *symRef;
  151.  
  152. };
  153.  
  154. class OtclNewObjectRqst : public OtclRequest
  155. {
  156. public:
  157.    OtclNewObjectRqst ();
  158.    OtclNewObjectRqst (char *className, long argc, char *argv[]);
  159.    ~OtclNewObjectRqst ();
  160.  
  161.    int streamIn (OtclChannel *);
  162.    int streamOut (OtclChannel *);
  163.  
  164.    int perform (Tcl_Interp *interp);
  165.  
  166. private:
  167.  
  168.    char *className;
  169.    long argc;
  170.    char **argv;
  171.  
  172. };
  173.  
  174. class OtclClassMethodRqst : public OtclRequest
  175. {
  176. public:
  177.    OtclClassMethodRqst ();
  178.    OtclClassMethodRqst (char *name, char *method, long argc, char *argv[]);
  179.    ~OtclClassMethodRqst ();
  180.  
  181.    int streamIn (OtclChannel *);
  182.    int streamOut (OtclChannel *);
  183.  
  184.    int perform (Tcl_Interp *interp);
  185.  
  186. private:
  187.  
  188.    void clear (void);
  189.  
  190.    char *name;
  191.    char *method;
  192.    long argc;
  193.    char **argv;
  194. };
  195.  
  196. class OtclResponse
  197. {
  198. public:
  199.    OtclResponse ();
  200.    OtclResponse(int returnValue, Tcl_Interp *interp);
  201.    OtclResponse(int returnValue, char *result);
  202.    ~OtclResponse ();
  203.  
  204.    int streamIn (OtclChannel *);
  205.    int streamOut (OtclChannel *);
  206.  
  207.    void setTclInterp (Tcl_Interp *);
  208.    int getReturnValue (void);
  209.  
  210. private:
  211.  
  212.    void clear (void);
  213.  
  214.    long returnValue;
  215.    char *result;
  216. };
  217.  
  218. class OtclRemoteObject : public OtclObject
  219. {
  220. public:
  221.    OtclRemoteObject (char *symRef, int &result, Tcl_Interp *interp);
  222.    ~OtclRemoteObject ();
  223.  
  224.    int executeMethod (Tcl_Interp *interp, char *method, int argc, char *argv[]);
  225.    int discard (Tcl_Interp *, int fromCpp);
  226.  
  227.    // A static version of the above method for the deletion
  228.    // or a remote object that hasn't been used locally and therefore
  229.    // doesn't have a proxy object.
  230.    static int discard (Tcl_Interp *, char *symRef);
  231.  
  232. private:
  233.    char *remoteSymRef;
  234.    char *address;
  235. };
  236.  
  237. class OtclRemoteClass
  238. {
  239. public:
  240.    OtclRemoteClass (Tcl_Interp *interp, char *name, char *address);
  241.    ~OtclRemoteClass ();
  242.    int instantiate (Tcl_Interp *, int argc, char *argv[]);
  243.    static int classCmd (ClientData, Tcl_Interp *, int argc, char *argv[]);
  244.    int classMethod (Tcl_Interp *, int argc, char *argv[]);
  245.    void setAddress (char *address, char *realName);
  246. private:
  247.    char *name;
  248.    char *address;
  249. };
  250.  
  251. #endif
  252.